Если вы используете механизм наследования, учитывайте все абстракции вашей объектной модели и те из них, которые можно будет повторно использовать, поместите в базовые классы как можно более высокого уровня. Добавлять и изменять свойства можно в более специализированных производных классах, которые наследуют стандартное поведение базовых. Благодаря наследованию облегчается повторное использование кода и его расширяемость. Кроме того, производный класс может содержать более подходящий для членов базового класса интерфейс.
Давайте рассмотрим базовый класс Reservable (Резервируемый объект, ресурс) и производный от него класс Hotel (Гостиница). У всех резервируемых объектов есть некоторые общие свойства, например, идентификатор объекта (ID), объем (capacity) и стоимость (cost). У каждого отдельного вида резервируемых объектов есть свои уникальные свойства. Например, в классе гостиницы есть атрибуты City (Город) и Hotel-Name (Название гостиницы).
Синтаксис наследования в управляемом C++
Наследование в управляемом C++ реализуется таким образом: в операторе class производного класса через двоеточие указывается имя базового класса. В файле HotelBroker.h в папке CaseStudy показано, как из базового класса Reservable (Резервируемый объект, ресурс) порождается класс Hotel (Гостиница).
public _gc class Hotel : public Reservable
// класс сборщика мусора - Гостиница:Reservable
{
};
Класс Hotel (Гостиница) автоматически наследует все поля класса Reservable (Резервируемый объект, ресурс) и содержит свои собственные поля City (Город) и Но-telName (Название гостиницы).
Внесение изменений в интерфейс существующих членов класса
Члены базового класса, unit id, capacity (объем имеющихся ресурсов), cost (стоимость), предназначены для внутреннего использования и не должны быть общедоступными. В классе Hotel (Гостиница) находятся общедоступные члены Hotel Id, Num-berRooms и Rate (Цена), к которым пользователи имеют доступ "только для чтения". Когда мы реализуем свойство таким образом, можно вместо абстрактного имени, например capacity (объем имеющихся ресурсов), которое используется в базовом классе, выбрать имя, более конкретное, например, NumberRooms.
Вызов конструкторов базового класса
Если в производном классе есть конструктор с параметрами, возможно, вы захотите передать некоторые из этих параметров в конструктор базового класса. В C++ можно вызвать конструктор базового класса, поставив перед ним двоеточие. В управляемом C++, в отличие от обычного неуправляемого C++, можно использовать только один базовый класс и список параметров, так как здесь поддерживается только единичное наследование.
Hotel( // Гостиница
String *city,
String *name,
int number, // число
Decimal cost) // Десятичная стоимость
: Reservable(number, cost) // число, стоимость
{
City = city;
// Город = город;
HotelName = name; // название
}
Обратите внимание на то, что в управляемом C++ можно вызвать только конструктор базового класса, из которого непосредственно был порожден данный класс. Нельзя вызвать конструктор, стоящий в иерархии наследования выше.